import matplotlib.pyplot as plt
import pandas as pd

"""
语法格式
    plt.boxplot(x, whis=None, widths=None, 
                patch_artist=None, showmeans=None, boxprops=None)
参数说明
    x: 指定要绘制箱形图的数据
    whis: 指定上下限与上下四分位的距离，默认为1.5倍的四分位差
    widths: 指定箱形图的宽度，默认为0.5
    patch_artist: 是否填充箱体的颜色
"""
# 简单的箱形图
x = [1, 3, 5, 7, 9]
x2 = [10, 78, 45, 34, 45, 87]
x3 = [43, 54, 1, 35, 65, 98, 78]

plt.boxplot([x, x2, x3])
plt.show()

"""
判断异常值：
    下四分位数--Q1
        指的是数据的25%分位点所对应的值
    中位数 --Q2
        数据的50%分位点所对应的值
    上四分位数--Q3
        75%分位点所对应的值
    上限
        Q3+1.5(Q3-Q1)
    下限
        Q1-1.5(Q3-Q1)
        
    异常值
        x>Q3+1.5(Q3-Q1)或x<Q1-1.5(Q3-Q1)
    极端异常值
        x>Q3+3(Q3-Q1)或x<Q1-3(Q3-Q1)
"""
# 通过箱型图判断总销售的异常值
df = pd.read_excel('libs/tips.xlsx')

plt.boxplot(
    df['总消费'],
    patch_artist=True,  # 填充箱子颜色
    showmeans=True,  # 显示均值

    # 设置异常值的填充色、边框色，大小
    flierprops={'markerfacecolor': 'red', 'markeredgecolor': 'r', 'markersize': 5},

    # 设置均值的符号、颜色、大小
    meanprops={'marker': 'h', 'mfc': 'black', 'markersize': 8},

    # 设置中位数的样式、颜色
    medianprops={'linestyle': '--', 'color': 'r'}
)
plt.show()

## 查找异常值
# 计算四分位数
Q1 = df['总消费'].quantile(q=0.25)
Q3 = df['总消费'].quantile(q=0.75)

# 上限和下限
low = Q1 - 1.5 * (Q3 - Q1)
up = Q3 + 1.5 * (Q3 - Q1)
print(low, up)

# 查找异常
val = df['总消费'][(df['总消费'] > up) | (df['总消费'] < low)]
print(val)
